package com.song.shirospringboot.config;



import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

/*
    Shiro配置类
        1.Subject用户
        2.SecurityManager管理所有用户
        3.Realm连接数据
 */
@Configuration
public class ShiroConfig {
    // 1、ShiroFilterFactoryBean  Shiro过滤器工厂Bean
    @Bean(name = "shiroFilterFactoryBean")
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        bean.setSecurityManager(defaultWebSecurityManager);  //设置安全管理

        /*
            添加shiro内置拦截过滤器:
                anon: 无需认证就可以访问
                authc: 必须认证了才能访问
                user:  必须拥有“记住我”功能才能用
                perms: 拥有对某个资源的权限才能访问
                role: 拥有某个角色权限才能访问
         */
        Map<String, String> fileterMap = new LinkedHashMap<>();

        // 页面访问权限控制
        // 实现用户必须有 user:add (user:update)权限，才能访问 add.html (update.html)页面，若果没有授权，自动跳转到未授权页面
        fileterMap.put("/user/add", "perms[user:add]");
        fileterMap.put("/user/update", "perms[user:update]");
        // 身份认证控制：
        // 实现用户必须登录认证了才能访问页面接口，如果没有登录认证，访问接口时候，自动跳转到登录页
        fileterMap.put("/user/*", "authc");

        bean.setFilterChainDefinitionMap(fileterMap);//设置过滤器链定义映射
        bean.setLoginUrl("/toLogin");//设置登录请求页面
        bean.setUnauthorizedUrl("/noauth");//设置未授权页面
        return bean;
    }

    // 2、DefaultWebSecurityManager  默认的Web安全管理器
    @Bean(name = "defaultWebSecurityManager")                                   //@Qualifier("userRealm") 注解，绑定下面的bean为入参
    public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm); //关联UserRealm
        return securityManager;
    }

    // 3、UserRealm：用户领域,注入自定义用户领域类
    @Bean(name = "userRealm")
    public UserRealm userRealm(){
        return new UserRealm();
    }


    // 4、ShiroDialect: 整合的Shiro-thymeleaf注册bean
    @Bean
    public ShiroDialect getShiroDialect() {
        return new ShiroDialect();
    }
}


